package com.hw.blog.utils;



import java.io.PrintWriter;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpServletResponse;

/*******************************************************************************
 * JSP 에서 사용될 각종 메소드를 정의한다.
 *
 * @author
 * @version 1.0
*******************************************************************************/

public class JspUtil {

	/****************************************************************************************
	 * 메세지출력후 액션. 
	 ****************************************************************************************/

	/*******************************************************************************
	 * 팝업창을 닫고, opener 페이지를 reload()한다.
	 *******************************************************************************/
	public static void goOpenerPageReload(HttpServletResponse res, String src) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "opener.location.reload();self.close(); </script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * opener 페이지의 TOP프레임을 reload()한다.
	 *******************************************************************************/
	public static void goOpenerReload(HttpServletResponse res, String src) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "opener.location.reload(); </script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * 팝업창을 닫고, opener 페이지의 TOP프레임을 지정된 URL로 이동한다.
	 *******************************************************************************/
	public static void goOpenerTopPageReload(HttpServletResponse res, String src, String url) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";

			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "opener.top.location='" + url + "';self.close();  </script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}


	/*******************************************************************************
	 * 팝업창을 닫고, opener 페이지의 지정된 프레임을 reload()한다.
	 *******************************************************************************/
	public static void goOpenerFrameReload(HttpServletResponse res, String src, String frameNm) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "opener.document."+frameNm+".reload();self.close(); </script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * paren 페이지를 새로고침함.
	 *******************************************************************************/
	public static void goParentPageReload(HttpServletResponse res) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			msg += "parent.location.reload();</script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * 메세지를 출력하고 부모창을 새로고침.
	 *******************************************************************************/
	public static void goMsgParentPageReload(HttpServletResponse res, String src) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "opener.location.reload();self.close(); </script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * 메세지를 출력하고 새로고침.
	 *******************************************************************************/
	public static void goMsgPageReload(HttpServletResponse res, String src) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "location.reload();</script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * 메세지를 출력하고 지정된 URL로 이동.
	 *******************************************************************************/
	public static void goMsgMovePage(HttpServletResponse res, String src, String url) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "location='"+ url +"';</script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}
	}

	/*******************************************************************************
	 * 메세지를 출력하고 TOP프레임을 지정된 URL 이동.
	 *******************************************************************************/
	public static void goMsgMoveTopPage(HttpServletResponse res, String src, String url) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "top.location='"+ url +"';</script>";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * 메세지를 출력하고 opener페이지를 지정된 URL 이동.
	 *******************************************************************************/
	public static void goMsgMoveOpenerPage(HttpServletResponse res, String src, String url) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient = res.getWriter();

			String msg = 	"<script language='JavaScript'>";
			if( src != null && src.length() > 0 ){
				msg += "	alert('" + src + "');";
			}
			msg += "opener.location='"+ url +"';self.close();</script>'";
			toClient.println(msg);
			toClient.flush();

		}catch( Exception e){
			e.printStackTrace();
		}

	}

	/*******************************************************************************
	 * 에러 발생시 에러 메시지( javascript alert())를 보여주고 창을 닫는다.
	 *******************************************************************************/
	public static void closeAlter(HttpServletResponse res, String src) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient =res.getWriter();
			if( src != null && src.length() > 0 ){
				String msg = "<script language='JavaScript'>alert('";
				msg = msg + src + "');";
				msg = msg + "self.close();</script>";
				toClient.println(msg);
				toClient.flush();
			}
		}catch( Exception e){
			e.printStackTrace();
		}
	}

	/*******************************************************************************
	 * 메세지만 출력한다.
	 *******************************************************************************/
	public static void alterMsg(HttpServletResponse res, String message) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient =res.getWriter();
			if( message != null && message.length() > 0 ){
				String msg = "<script language='JavaScript'>alert('";
				msg = msg + message + "');";
				msg = msg + "</script>";
				toClient.println(msg);
				toClient.flush();
			}
		}catch( Exception e){
			e.printStackTrace();
		}
	}

	public static void loginCheck ( HttpServletResponse res, String url ) {

		try {
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter printWriter = res.getWriter();

			StringBuffer jsString = new StringBuffer();

			jsString
			.append("\n<script language=\"javascript\">")
			.append("\n  <!--")
			.append("\n      alert(\"로그인 정보가 없습니다.\");")
			.append("\n      if (opener == null) {")
			.append("\n        top.location.href=\"/login.do\";")
			.append("\n      } else {")
			.append("\n        this.close();")
			.append("\n        opener.top.location.href=\"/login.do\";")
			.append("\n      }")
			.append("\n  //-->")
			.append("\n</script>");

			printWriter.println(jsString.toString());
			printWriter.flush();

		} catch (Exception ex ) {
			ex.printStackTrace();
		}

	}



	/*******************************************************************************
	 * 메세지 출력하고, 자바스크립트 실행 (GreatYSI)
	 *******************************************************************************/
	public static void alterMsgMethod( HttpServletResponse res, String message, String javascript ) {
		if( message != null && message.length() > 0 && javascript != null && javascript.length() > 0 ) {
			try{
				res.setContentType("text/html; charset=euc-kr");
				PrintWriter toClient =res.getWriter();
				StringBuffer msg = new StringBuffer();

				msg
				.append(" <script language='JavaScript'> ")
				.append(" alert('" + message + "');      ")
				.append("  " + javascript + "            ")
				.append(" </script>                      ");

				toClient.println( msg.toString() );
				toClient.flush();
			}catch( Exception e){
				e.printStackTrace();
			}
		}
	}


	/*******************************************************************************
	 * 메세지 출력하고, history.back(-1) (GreatYSI)
	 *******************************************************************************/
	public static void alterMsgBack( HttpServletResponse res, String message ) {
		if( message != null && message.length() > 0 ) {
			try{
				res.setContentType("text/html; charset=euc-kr");
				PrintWriter toClient = res.getWriter();
				StringBuffer msg     = new StringBuffer();

				msg
				.append(" <script language='JavaScript'> ")
				.append(" alert('" + message + "');      ")
				.append(" history.go(-1);                ")
				.append(" </script>                      ");

				toClient.println( msg.toString() );

				toClient.flush();
			}catch( Exception e){
				e.printStackTrace();
			}
		}
	}

	/********************************************************************************
	 * 지정한 창에 특정한 메소드를 호출한다.
	 *******************************************************************************/
	public static void goOpenerMethod(HttpServletResponse res, String target, String method) {

		try{
			res.setContentType("text/html; charset=euc-kr");
			PrintWriter toClient =res.getWriter();
			if( method != null && method.length() > 0 ){
				String 	msg = "<script language='JavaScript'>" +
							  target + "." + method +
							  "</script>";
				toClient.println(msg);
				toClient.flush();
			}
		}catch( Exception e){
			e.printStackTrace();
		}
	}

	/*******************************************************************************
     * 숫자를 원표시로 변환(5000: -> 5,000 10000: -> 10,000)
	 *******************************************************************************/
	public static String priceToStr(long price) {

	    if(price < 1000 && price >= -999)
	        return String.valueOf(price);

	    String priceStr = String.valueOf(price);
	    int r = priceStr.length() % 3;

	    StringBuffer strBuf = new StringBuffer();

	    strBuf.append(priceStr.charAt(0));
	    for (int i = 1; i < priceStr.length(); i++) {
			if (i % 3 == r)
			    strBuf.append(",");
			strBuf.append(priceStr.charAt(i));
	    }

		if(strBuf.toString().indexOf("-,") == 0)
			return strBuf.toString().replaceFirst("-,", "-");
		else
			return strBuf.toString();
	}

	/*******************************************************************************
     * 숫자를 원표시로 변환(5000: -> 5,000 10000: -> 10,000)
	 *******************************************************************************/
//	public static String priceToStr(double price) {
//		String pricestr ="";
//		pricestr +=  price;
//		String[] arrPricestr = split( pricestr , ".", 2);
////		System.out.println(">>>>>>>>>>>>>>>  arrPricestr  :: "+arrPricestr.length);
////		System.out.println(">>>>>>>>>>>>>>>  arrPricestr[0]  :: "+arrPricestr[0]);
////		System.out.println(">>>>>>>>>>>>>>>  arrPricestr[1]  :: "+arrPricestr[1]);
//		if( arrPricestr[1] == null || Integer.parseInt(arrPricestr[1])== 0 || "".equals(arrPricestr[1])){
//			arrPricestr[1] = "00";
//		}
//		return priceToStr(arrPricestr[0].trim())+"."+arrPricestr[1];
//
//	}

	/*******************************************************************************
     * 숫자를 원표시로 변환(5000: -> 5,000 10000: -> 10,000)
	 *******************************************************************************/
	public static String priceToStr(String price) {
		if ("".equals(price)) {
			return "";
		}
		return priceToStr( Long.parseLong(price) );
	}

	/*******************************************************************************
	 *  지정된 날짜에서 원하는 일수 만큼 이동된 날짜를 반환한다.
	 * @param strDate Date 객체
	 * @param offset 이동할 일수( -2147483648 ~ 2147483647 )
	 * @return 변경된 날짜
	 *******************************************************************************/
	public static Date getOffsetDateToDate(String strDate, int offset) throws Exception {

	    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
	    Date date = new Date();

	    try {
	    	 date = fmt.parse(strDate);
	    	 return getOffsetDateToDate(date, offset);
	    }
	    catch(Exception e) {
	    }
	    return getOffsetDateToDate(date, offset);
	}

	/*******************************************************************************
	 *  String 타입의 날짜를  지정한 형식의 Date 타입의 날짜로 반환한다.
	 * @param strDate String 타입의 날짜
	 * @param pFormat SimpleDateFormat에 정의된 날짜형식
	 * @return 변경된 날짜
	 *******************************************************************************/
	public static Date getDate(String strDate, String pFormat) throws Exception {
		if( strDate == null )
			return null;

		return new SimpleDateFormat(pFormat).parse(strDate, new ParsePosition(0));
	}


	/*******************************************************************************
	 *  지정된 날짜에서 원하는 일수 만큼 이동된 날짜를 반환한다.
	 * @param pDate Date 객체
	 * @param offset 이동할 일수( -2147483648 ~ 2147483647 )
	 * @return 변경된 날짜
	 *******************************************************************************/
	public static Date getOffsetDateToDate(Date pDate, int offset) throws Exception {
	    Calendar c = Calendar.getInstance();
	    Date ret = null;

	    try {
	        c.setTime(pDate);
	        c.add(6, offset);
	        ret = c.getTime();
	    }
	    catch(Exception e) {
	    }
	    return ret;
	}

	/*******************************************************************************
	 * 현재일자를 반환한다.(형식 yyyyMMdd)
	 * @return 현재일자
	 * @throws Exception
	 *******************************************************************************/
    public static String getToday() {
		return getDate(new Date(), "yyyyMMdd");
	}

	/**
	 * 오늘부터 원하는 일수 만큼 이동된 날짜를 반환한다.
	 * @param offset
	 * @return
	 * @throws Exception
	 */
	public static String getOffsetDateToday(int offset, String pFormat) throws Exception {
	    Calendar c = Calendar.getInstance();
	    Date ret = null;

	    try {
	        c.setTime(new Date());
	        c.add(6, offset);
	        ret = c.getTime();
	    }
	    catch(Exception e) {
	    }
	    return getDate(ret, pFormat);
	}

	/*******************************************************************************
	 * 현재시간을 반환한다.(형식 yyyy.MM.dd hh:mm:ss)
	 * @return 현재 시간
	 * @throws Exception
	 *******************************************************************************/
	public static String getTodayTime() {
		return getDate(new Date(), "yyyy.MM.dd HH:mm:ss");
	}

	/*******************************************************************************
	 * 현재일자를 지정한 형식으로 반환한다.
	 * @return 현재일자
	 * @throws Exception
	*******************************************************************************/
	public static String getToday(String pFormat) {
		return getDate(new Date(), pFormat);
	}

	/*******************************************************************************
	 *  Date 타입의 날짜를  지정한 형식의 문자형 날짜로 반환한다.
	 * @param pDate Date 객체
	 * @param pFormat SimpleDateFormat에 정의된 날짜형식
	 * @return 변경된 날짜
	*******************************************************************************/
	public static String getDate(Date pDate, String pFormat) {

        if(pDate == null)
            return "";

		StringBuffer ret = new StringBuffer();
		new SimpleDateFormat(pFormat).format(pDate, ret, new FieldPosition(0));
		return ret.toString();
	}

	/**
     * 문자열 내의 특정한 문자열을 모두 지정한 다른 문자열로 바꾼다.
     * 원본 String 이 null 일 경우에는 null 을 반환한다.
     *
     * 사용 예:
     *
     *   1. 게시판에서 HTML 태그가 안 먹히게 할려면
     *      String str = "<TD>HTML Tag Free Test</TD>";
     *      str = replace(str, "&", "&amp;");
     *      str = replace(str, "<", "&lt;");
     *
     *   2. ' 가 포한된 글을 DB 에 넣을려면
     *      String str2 = "I don't know.";
     *      str2 = replace(str2, "'", "''");
     *
     * @param   String src       원본 String
     * @param   String oldstr    원본 String 내의 바꾸기 전 문자열
     * @param   String newstr    바꾼 후 문자열
     * @return  String           치환이 끝난 문자열
     */
    public static String replace(String src, String oldstr, String newstr)
    {
        if (src == null)
            return null;

        StringBuffer dest = new StringBuffer("");
        int  len = oldstr.length();
        int  srclen = src.length();
        int  pos = 0;
        int  oldpos = 0;

        while ((pos = src.indexOf(oldstr, oldpos)) >= 0) {
            dest.append(src.substring(oldpos, pos));
            dest.append(newstr);
            oldpos = pos + len;
        }

        if (oldpos < srclen)
            dest.append(src.substring(oldpos, srclen));

        return dest.toString();
    }

    public static String replaceEnter(String src, String newstr)
    {
        if (src == null)
            return "";
        return replace(replace(src, "\n", newstr), "\r", "");
    }
    /*
     * 문자열이 null 이면 ""을 리턴한다.
     */
    public static String checkNullStrng(String src) {
      	return src == null ? "" : src;
      }

	/**
	 * 지정 한 문자길이 만큼 지정한 문자열을 채운다.
	 * @param str1 문자열
	 * @param str2 채울 문자열
	 * @param len 길이
	 * @param typ R: rPadding, L; lPadding
	 * @return
	 */
//	public static String pading ( String str1, char str2, int len, String typ ) {
//
//		String temp = "";
//		try {
//			if ( typ.equals("R") || typ.equals("r") ) {
//				temp = StringUtils.rightPad( str1, len, str2 );
//			} else if ( typ.equals("L") || typ.equals("l") ) {
//				temp = StringUtils.leftPad( str1, len, str2 );
//			}
//
//		} catch ( Exception e ) {
//			e.printStackTrace();
//			System.out.println("Error : " + e.getMessage());
//		}
//		return temp;
//	}

	/**
	 * String NULL Check
	 * @param param
	 * @return
	 */
	public static boolean isNull(String param)
    {
        return param == null || "".equals(param);
    }

	/**
	 * length 체크 한글은 2byte 기타는 1byte
	 * @param str
	 * @return
	 */
	public static final int getByteSizeToComplex(String str) {
		int en = 0;
		int ko = 0;
		int etc = 0;

		char[] string = str.toCharArray();

		for (int j = 0; j < string.length; j++) {
			if (string[j] >= 'A' && string[j] <= 'z') {
				en++;
			} else if (string[j] >= '\uAC00' && string[j] <= '\uD7A3') {
				ko++;
				ko++;
			} else {
				etc++;
			}
		}

		return (en + ko + etc);
	}
	
	public static final String getByteSizeToString(String str,int len) {
		int en = 0;
		int ko = 0;
		int etc = 0;

		char[] string = str.toCharArray();
		
		StringBuffer returnStr = new StringBuffer();

		for (int j = 0; j < string.length; j++) {
			if((en + ko + etc)>(len-3)){
				return returnStr.toString()+"...";
			}
			returnStr.append(string[j]);
			if (string[j] >= 'A' && string[j] <= 'z') {
				en++;
			} else if (string[j] >= '\uAC00' && string[j] <= '\uD7A3') {
				ko++;
				ko++;
			} else {
				etc++;
			}
		}

		return returnStr.toString();
	}

	/**
	 * 지정한 사이즈 만큼 배열을 만들어서 리턴한다.
	 * @param str 문자열
	 * @param arg1 구분자
	 * @param size 크기
	 * @return
	 */
//	public static String[] split( String str, String arg1, int size ) {
//
//		String temp[] = new String[size];
//
//		String str1[] = StringUtils.splitPreserveAllTokens(str == null ? "" : str, arg1);
//
//		try {
//
//			for( int idx = 0; idx < temp.length; idx++ ) {
//				if ( idx < str1.length) {
//					temp[idx] = str1[idx] == null ? "" : str1[idx];
//				} else {
//					temp[idx] = "";
//				}
//			}
//
//		} catch ( Exception e ) {
//			e.printStackTrace();
//			System.out.println("Error : " + e.getMessage());
//		}
//		return temp;
//	}
}
